package chatNI;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

import javax.rmi.CORBA.Util;

import chatControler.ChatControler;
import chatModel.*;

/**
 * Thread qui gère l'envoi de données en mode connecté TCP
 * Il est utilisé pour l'envoi de fichier
 * @author vincent
 */
public class ThreadTcpEnvoie extends Thread {
	
	private Socket socket;
	private File file;
	private ChatControler chatControler;
	private UtilisateurDistant user;
	
        /**
         * Constructeur du Thread
         * @param socket Socket qui sera utilisé pour l'envoi
         * @param file Fichier à envoyer
         * @param chatControler ChatControler du chatSystem pour l'avertir que la reception est finie
         * @param user Destinataire
         */
	public ThreadTcpEnvoie(Socket socket, File file, ChatControler chatControler, UtilisateurDistant user) {
		this.socket = socket;
		this.file = file;
		this.chatControler = chatControler;
		this.user=user;
	}
	
        /**
         * Permet de faire les actions lors du démarrage du thread
         */
	public void run(){
		sendFile(this.socket, this.file);
	}
	
        /**
         * Envoi physiquement sur le réseau le fichier à l'utilisateur distant
         * @see chatControler.ChatControler#fichierEnvoye(chatModel.UtilisateurDistant) fichierEnvoye
         * @param socket Socket dans lequel va passer le fichier
         * @param file Fichier à envoyer
         */
	public void sendFile(Socket socket, File file){
		InputStream fichierDEntree=null;
		OutputStream fichierDeSortie=null;
		
		try {
			fichierDEntree = new FileInputStream(file);
			fichierDeSortie = this.socket.getOutputStream();
			
			byte[] toSend = new byte[1024];
			int i;
			while (( i = fichierDEntree.read(toSend, 0, 1024)) != -1){
				fichierDeSortie.write(toSend, 0, i);
			}
			this.chatControler.fichierEnvoye(user);
			
		} catch (IOException e) {
			System.out.println("Problème avec la socket");
			e.printStackTrace();
		}finally{
			try {
				fichierDEntree.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			try {
				fichierDeSortie.flush();
				fichierDeSortie.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			try {
				this.socket.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
	}
	
	

}
